package funda.appius.arquitectura;

import java.sql.*;
import java.util.ArrayList;


public class ConexionMySQL
{
    /*VARIABLES DE USO GENERAL*/
    private String url = "jdbc:mysql://192.168.1.3/fundaappius";
    private String username = "appius";
    private String pass = "CsQNLdb6q3N8UR3a";
    
    private Connection getConnection() throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");
        java.sql.Connection con =DriverManager.getConnection(url,username,pass);
        return con;
    }

    /* Metodo: getQuery
        * Funcion: obtener DataSet de una query
        * String query - query a realizar
        * Regresa DataSet
        */

    public ResultSet GetQuery(String query)
    {
        try{
            Connection con = getConnection();
            Statement stmt = con.createStatement();
            ResultSet r = stmt.executeQuery(query);
            return r;
        }
        catch(Exception e)
        {
            error(e);
            return null;
        }
        finally
        {
            
        }
    }//fin del metodo getQuery

    /* Metodo: getQuery
    * Funcion: obtener DataSet de una query
    * Diccionario de parametros,valores y nombre del stored procedure
    * Regresa DataSet
    */

        public ResultSet GetQuery(ArrayList<Object> diccionario, String procedure)
    {
            try
            {
                Connection con = getConnection();
                CallableStatement stmt = con.prepareCall(procedure);
                for(int x=0;x<diccionario.size();x++)
                    stmt.setString(x+1, diccionario.get(x)+"");
                ResultSet rs = stmt.executeQuery();
                con.close();
                return rs;
            }
            catch (Exception e)
            {
                error(e);
                return null;
            }
           
    }//fin del metodo getQuery

    /* Metodo: AcccionesDB
        * Funcion: Processos en la base de datos
        * String: Diccionario de parametros y valores, nombre del stored procedure
        * Regresa T/F
        */

    public void AccionesDB(ArrayList<Object> diccionario, String procedure)
    {
          try
            {
                Connection con = getConnection();
                CallableStatement stmt = con.prepareCall(procedure);
                for(int x=0;x<diccionario.size();x++)
                    stmt.setString(x+1, diccionario.get(x)+"");
                stmt.execute();
            }
            catch (Exception e)
            {
                error(e);
            }

    } // fin del metodo InsertarParametros
    public void AccionesDB(String sql)
    {
         try
            {
                Connection con = getConnection();
                Statement stmt = con.createStatement();
                stmt.execute(sql);
            }
            catch (Exception e)
            {
                error(e);
            }

    } // fin del metodo InsertarParametros

    /* Metodo: insertar
        * Funcion: Meter registro a la base de datos
        * Diccionario parametros y valores, nombre del stored procedure, atributo id de la tabla, nombre de la tabla
        * Regresa ID/-1
        */

    public Object insertar(ArrayList<Object> diccionario, String procedure, String id, String tabla)
    {
         try
            {
                
                /*METER REGISTRO*/
                Connection con = getConnection();
                CallableStatement cs = con.prepareCall(procedure);
                for(int x =0;x<diccionario.size();x++)
                    cs.setString(x+1, diccionario.get(x)+"");
                cs.execute();
                con.close();
                /****************/
                
                /***OBTENER ID DEL ULTIMO REGISTRO***/
                ResultSet rs = GetQuery("SELECT " + id + " FROM " + tabla + " ORDER BY " + id + " DESC LIMIT 1");
                String retId="";
                while (rs.next()) {
                    retId = rs.getString(1);
                } //end while
                return retId;
            }
            catch (Exception e)
            {
                error(e);
                return -1;
            }

    } // fin del metodo Insertar

    /* Metodo: insertar
        * Funcion: Meter registro a la base de datos
        * Diccionario parametros y valores, nombre del stored procedure, atributo id de la tabla, nombre de la tabla
        * Regresa ID/-1
        */

    public Object insertar(ArrayList<Object> diccionario, String procedure)
    {
        try
            {
                
                /*METER REGISTRO*/
                Connection con = getConnection();
                CallableStatement cs = con.prepareCall(procedure);
                
                for(int x =0;x<diccionario.size();x++)
                    cs.setString(x+1, ""+diccionario.get(x));
                
                cs.execute();
                con.close();
                /****************/
                return true;
            }
            catch (Exception e)
            {
                error(e);
                return -1;
            }

    } // fin del metodo Insertar

    public static void error(Exception e)
    {
        String error = "Conexion";
        String descripcion = e.getMessage();
        System.out.println(e.toString());
    }

} 